#include "Jugador.h"
using namespace TP::Juego;

Jugador::Jugador() {
	this->_nombre = "JUGADOR";
	this->_puntaje = 0.0;
}

Jugador::Jugador(const string& pNombre) {
	this->_nombre = pNombre;
	this->_puntaje = 0.0;
}

Jugador::~Jugador() {}

const string& Jugador::getNombre() {
	return this->_nombre;
}

string Jugador::aXML() {
	TiXmlDocument* doc = new TiXmlDocument();
	TiXmlDeclaration * decl = new TiXmlDeclaration("1.0", "", "");
	doc->LinkEndChild(decl);

	doc->LinkEndChild(this->aElementoXML());

	TiXmlPrinter printer;
	doc->Accept(&printer);
	return printer.CStr();
}

string Jugador::aXML(const string& pPath) {
	TiXmlDocument* doc = new TiXmlDocument(pPath.c_str());
	TiXmlDeclaration * decl = new TiXmlDeclaration("1.0", "", "");
	doc->LinkEndChild(decl);

	doc->LinkEndChild(this->aElementoXML());

	TiXmlPrinter printer;
	doc->Accept(&printer);
	return printer.CStr();
}

void Jugador::parseXML(const string& pDescriptor) {
	TiXmlDocument doc;
	doc.Parse(pDescriptor.c_str(), 0, TIXML_ENCODING_UTF8);
	this->deElementoXML(doc.FirstChildElement());
}

TiXmlElement* Jugador::aElementoXML() {
	TiXmlElement * element = new TiXmlElement("Jugador");
	element->SetAttribute("nombre", this->getNombre().c_str());
	element->SetDoubleAttribute("puntaje", this->getPuntaje());
	return element;
}

void Jugador::deElementoXML(TiXmlElement* pElemento) {
	if (strcmp(pElemento->Value(), "Jugador") == 0) {
		this->_nombre = pElemento->Attribute("nombre");
		pElemento->Attribute("puntaje", &this->_puntaje);
	}
}

bool Jugador::operator==(const Jugador& pJugador) {
	return this->_nombre == pJugador._nombre;
}

Jugador* Jugador::crearDeXML(const string& pDescriptor) throw (Excepcion&) {
	TiXmlDocument doc;
	doc.Parse(pDescriptor.c_str(), 0, TIXML_ENCODING_UTF8);

	if (0 != strcmp(doc.FirstChildElement()->Value(), "Jugador"))
		throw Excepcion("El descriptor XML no corresponde a un descriptor"
				" de Jugador.");
	Jugador* jugador = new Jugador();
	jugador->deElementoXML(doc.FirstChildElement());
	return jugador;
}

double Jugador::incrementarPuntaje(double pCantidad) {
	if (pCantidad > 0)
		this->_puntaje += pCantidad;

	return this->_puntaje;
}

double Jugador::getPuntaje() {
	return this->_puntaje;
}